在上一篇我們實際試著把幾個pipeline翻成workflow,並看了如果搬到Github Actions,pipeline變成workflow能變得多簡潔
這篇我們會來會來看一下完成我踩過甚麼奇怪的雷,也幫助大家繞開這些雷
開發workflow時想試跑看看,在Github Actions的左側列表卻發現找不到
不在default branch上的workflow,不會出現在Github Actions的左側列表
,所以即便有workflow_dispatch也無法手動觸發
此外使用github cli也無法觸發不在default branch上的workflow
只能使用push事件,然後定義branches為當下的分支,測試完後再刪掉
workflow沒開始就然後被停掉,狀態顯示"Startup failure"
通常是語法錯誤或者誤把job的needs設為job本身
執行的js檔中利用console.log()當作set put的workaround,卻發現印出的值與預期不同
js檔中所有印出,都會被當作是output內容
如果有用ansi code幫字串上色,也會被當作是output內容,所以把ansi code(上圖黃圈處)刪掉即可
報錯" Unable to process file command 'env' successfully."
變數值的內容太長,改用multiline string語法
報錯"Plain value cannot start with flow indicator character"
把!運算子改成用 == false
shell command的if無法讀到Github Actions環境變數
改用Github Actions的if
另外考慮到維護性,或者當flow完全不同時,也建議改用Github Actions的if
使用.length曲陣列長度,卻被當成要用object filter取每個元素的.length屬性
Github Actions的context沒有提供這個功能
可以參考這篇的最佳解Getting object length?使用jq
或者直接使用bash指令取得長度,再存到output讓其他job也可以取用
arr=(1 2 3 4)
echo "arrLen=${#arr[@]}" >> $GITHUB_OUTPUT
如果只是要知道是否為空陣列也可以使用陣列中第一個元素是否為null來判斷
# 當arrStr為"[]"
# 以下為true、false
echo ${{fromJSON(env.arrStr)[0] == null}}
echo ${{fromJSON(env.arrStr)[0] != null}}
metadata file沒有autocompeletion
目前未有這個功能,不過作者說他有記下來,未來會考慮做
metadata file沒有語法驗證
github action外掛不支援.github/workflow外的.yaml、.yml的驗證,可以使用red hat出的YAML套件做補救方案
這個套件會預設使用以下的schema去檢查action.yaml、action.yml,所以不必在vscode的settings再多做設定,但如果有需求也可以仿造下方範例幫YAML套件添加其他schema
"yaml.schemas": {
"http://json.schemastore.org/github-action": [
"action.yaml",
"action.yml"
]
},
可以在metadata file同時使用steps和main,然後在step跑安裝node package的指令?
不行,steps 和 main 是兩種不同的屬性,分別用來處理不同類型的action,因此這兩者不能同時出現在同一個action.yml中
使用JS action時報錯"ReferenceError: require is not defined in ES module scope, you can use import instead"
require()是commonJS的import方式,ES module的話要改成import
報錯"canot found action.yml"
先查看log確認是否為路徑錯誤
是的話,就是指向的檔案路徑不對。可用指令cd跳過去,或者用ls看目前的目錄底下有哪些路徑可以跳
不是的話,通常是忘記clone repo,使用actions/checkout@v4即可
reusable workflow(called workflow)不能使用${{secrets.SECRET_NAME}}直接取用secret
reusable worflow中不能透過secret context取得secret
,只能從caller workflow透過input傳入
在caller workflow內上傳artiface,試圖在reusable workflow(called workflow)使用actions/download-artifact把artifact下載下來卻失敗
artifact
是只能在同一個 workflow 的不同 jobs 之間共享,並不能在不同的 workflows 之間
直接取用
這種情況可以考慮把reusable workflow改成JS actions
使用slackapi/slack-github-action時傳payload,可是卻出現invalid json
檢查payload中的最後一個屬性有無trailing comma,有的話刪掉
payload: |
{
"text": "New Version 🚀",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "New version $newVersion is deployed."
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "For more details, please refer to release note."
}
}, // 這一行的逗點就是trailing comma
]
}